<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>

  <body>
    <!-- 1.为整个脚本开始严格模式 -->
    <script>
      (function () {
        "use strict";
        // 代码
      })();
    </script>

    <!-- 2.为某个函数开启 -->
    <script>
      function fn() {
        "use strict";
      }
    </script>

    <!-- 3. 严格模式的变化 -->
    <script>
      "use strict";
      // // 1.变量先声明在使用
      // num = 10;
      // console.log(num);

      // 2.严禁删除声明变量
      var nm = 10;
      console.log(nm);
      // delete nm;//错误

      // 3但全局作用域中的函数中的this指向的是undefined
      function fn() {
        console.log(this);
      }
      fn(); //undefined

      //4构造函数中的this:
      // 严格模式下如果不加new调用，而采用直接调用构造函数的方法，此时里面的this为undefined
      // ，若为undefined添加属性则会报错
      // 使用new的话this指向的就是实例对象

      function Star() {
        this.name = "adele";
      }
      // Star();
      // console.log(window.sex);
      var ldh = new Star();
      console.log(ldh.name);

      // 5.严格模式下定时器中的this指向的还是window
      // setTimeout(function() {
      //     console.log(this);
      // }, 2000)

      // 6.严格模式下函数不允许有重名的参数
      // function fn(a, a) {
      //     console.log(a + a);
      // }
      // fn(2, 3)

      // 7.为了与ES6中的块级作用域‘接轨’，ES5的严格模式不允许在非函数的代码块中声明函数
      // if (true) {
      //     //会报错
      //     function fun() {
      //         console.log(1);
      //     }
      //     fun()
      // }
      // for (var i = 0; i < 5; i++) {
      //     //会报错
      //     function fun() {
      //         console.log(1);
      //     }
      //     fun()
      // }

      // function func1() {
      //     // 合法
      //     function func2() {

      //     }
      // }
    </script>
  </body>
</html>
